/*
 * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
 *
 * https://www.mall4j.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */
package com.yami.shop.service;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yami.shop.bean.app.dto.DeliveryDto;
import com.yami.shop.bean.dto.OrderRefundDto;
import com.yami.shop.bean.model.Order;
import com.yami.shop.bean.model.OrderRefund;
import com.yami.shop.bean.model.RefundDelivery;
import com.yami.shop.bean.model.RefundInfo;
import com.yami.shop.bean.param.OrderRefundParam;
import com.yami.shop.bean.param.UserManagerParam;

import java.util.List;

/**
 * @author yami
 */
public interface OrderRefundService extends IService<OrderRefund> {

    /**
     * 获取退款申请列表
     * @param page 分页参数
     * @param orderRefundDto 查询参数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param type 是否展示赠品信息,1.展示,0.不展示
     * @return 退款申请列表
     */
    IPage<OrderRefundDto> getPage(Page page, OrderRefundDto orderRefundDto, String startTime, String endTime, Integer type);

    /**
     * 根据编码查询退款单信息
     * @param refundSn 退款单编码
     * @return 退款包装对象
     */
    OrderRefundDto getOrderRefundByRefundSn(String refundSn);

    /**
     * 根据ID获取退款单信息
     * @param refundId 退款单ID
     * @param shopId 店铺id
     * @return 退款包装对象
     */
    OrderRefundDto getOrderRefundById(Long refundId, Long shopId);

    /**
     * 根据退款编号获取物流信息
     * @param refundSn
     * @return
     */
    DeliveryDto getDeliverInfoByRefundSn(String refundSn);

    /**
     * 生成退款单
     * @param orderRefund 退款对象
     */
    void applyRefund(OrderRefund orderRefund);

    /**
     * 处理退款订单
     * @param orderRefundParam 参数对象
     * @param shopId 店铺id
     * @return 退款详情
     */
    OrderRefundDto processRefundOrder(OrderRefundParam orderRefundParam,Long shopId);

    /**
     * 退货处理
     * @param orderRefundParam 参数对象
     * @param shopId 店铺id
     * @return 退款详情
     */
    OrderRefundDto returnMoney(OrderRefundParam orderRefundParam,Long shopId);

    /**
     * 买家提交物流信息
     * @param orderRefund 退款单对象
     * @param refundDelivery 退款物流单对象
     */
    void submitExpress(OrderRefund orderRefund, RefundDelivery refundDelivery);


    /**
     * 系统自动退款操作（批量）
     * @param orderRefundDtoList 退款订单列表
     */
    void systemAutoRefundBatch(List<OrderRefundDto> orderRefundDtoList);

    /**
     * 系统验证退款结果
     * @param refundInfo 退款详情
     * @param payRefundId 支付退款单号
     */
    void verifyRefund(RefundInfo refundInfo, String payRefundId);

    /**
     * 提交退款请求（向微信/支付宝发起退款请求）
     * @param orderRefundDto 退款信息
     */
    void submitWxRefund(OrderRefundDto orderRefundDto);

    /**
     * 根据订单id获取退款成功的金额
     * @param orderId 订单id
     * @return 退款成功的金额
     */
    double sumRefundSuccessAmountByOrderId(Long orderId);

    /**
     * 通过订单id获取正在处理中的退款订单信息
     * @param orderId 订单id
     * @return 正在处理中的退款订单信息
     */
    List<OrderRefund> getProcessingOrderRefundByOrderId(Long orderId);

    /**
     * 取消申请超时的订单，无论该超时订单处于任何状态
     * @param orderRefundList 退款订单列表
     */
    void cancelWhenTimeOut(List<OrderRefund> orderRefundList);

    /**
     * 校验退款时间
     * @param order 订单
     * @return 订单是否在退款时间内
     */
    boolean checkRefundDate(Order order);

    /**
     * 根据订单id获取退款成功的平台金额
     * @param orderId 订单id
     * @return 退款成功的平台金额
     */
    double sumRefundSuccessPlatformAmountByOrderId(Long orderId);

    /**
     * 售后金额  售后次数
     * @param param 查询参数
     * @return 售后金额  售后次数
     */
    UserManagerParam getRefundDataByUserId(UserManagerParam param);

    /**
     * 通过退款编号修改退款订单信息
     * @param orderRefund 退款信息
     */
    void updateByRefundSn(OrderRefund orderRefund);

    /**
     * 获取该退款单号是否为最后一个订单项
     * @param refundSn
     * @param shopId
     * @return
     */
    Boolean getIsLastRefund(String refundSn, Long shopId);

    /**
     * 根据退款单号列表获取退款商品信息
     * @param refundSnList
     * @return
     */
    List<OrderRefundDto> listRefundInfoByRefundSnList(List<String> refundSnList);
}
